package com.tang.event;

import com.tang.event.listener.EventListener;
import com.tang.vo.LotteryResult;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EventManager {

    Map<Enum<EventType>, List<EventListener>> listeners = new HashMap<>();

    @SafeVarargs
    public EventManager(Enum<EventType>... operations) {
        // 初始化
        for (Enum<EventType> operation : operations) {
            this.listeners.put(operation, new ArrayList<>());
        }
    }

    /**
     * 内部类写枚举，
     * 枚举防止乱传数据
     */
    public enum EventType {
        MQ, MSG
    }

    /**
     * 订阅
     *
     * @param typeEnum 事件类型
     * @param listener 监听
     */
    public void subscribe(Enum<EventType> typeEnum, EventListener listener) {
        List<EventListener> listenerList = listeners.get(typeEnum);
        listenerList.add(listener);
    }

    /**
     * 取消订阅
     *
     * @param typeEnum 事件类型
     * @param listener 监听
     */
    public void unsubscribe(Enum<EventType> typeEnum, EventListener listener) {
        List<EventListener> listenerList = listeners.get(typeEnum);
        listenerList.remove(listener);
    }

    /**
     * 通知
     *
     * @param typeEnum 事件类型
     * @param result   结果
     */
    public void notify(Enum<EventType> typeEnum, LotteryResult result) {
        List<EventListener> listenerList = this.listeners.get(typeEnum);
        for (EventListener listener : listenerList) {
            listener.doEvent(result);
        }
    }

}
